Google Cloudの組織ポリシー(制約)の一覧をExcelに出力してみた #cm_google_cloud_adcal_2024

Google Cloudの組織ポリシー(制約)の一覧をExcelに出力してみた #cm_google_cloud_adcal_2024

組織ポリシーの制約一覧をAPIで取得してExcelに出力するスクリプトを作ってみました。
Clock Icon2024.12.04

この記事はクラスメソッドの Google Cloud Advent Calendar 2024 の 4日目のブログです。
いよいよクリスマスの季節ですね!
Google Cloud Advent Calendar 2024では Google Cloud大好きなクラメソエンジニアたちが技術ブログを持ち回りで毎日絶賛執筆中です。
是非クリスマスまでお楽しみください!
https://qiita.com/advent-calendar/2024/cm-google-cloud

さて今回は組織ポリシーの制約一覧をExcelに出力するスクリプトをご紹介します!

概要

Google Cloudの組織ポリシーの制約は以下のとおりリファレンスに一覧が記載されています。
https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints?hl=ja

一覧が記載されているのですが、じゃあ実際に組織を作ろう・どんな制約を適用しようか考えようという時にはExcelやスプレッドシートなどで扱いたくなる時もあるかと思います。
とはいえコピペで作るのも手間だし新しい制約が追加された場合に作り直すのも大変だなと思い、APIでうまいこと取得してExcel出力できないものかと考えました。
そして、組織ポリシーのクライアントOrgPolicyClientを見ているといい感じのClassがあったのでこれはできるなと思いやってみました。
https://cloud.google.com/python/docs/reference/orgpolicy/latest/google.cloud.orgpolicy_v2.types.Constraint

やりたいこと

  • pythonを使って組織ポリシーの制約一覧を取得し、Excelへ出力したい
  • 制約の説明は日本語に翻訳したい

やってみた

どの項目を取得するか考える

リファレンスを見ると取得できるフィールドは下記のとおりでした。

フィールド名 説明
name 制約のリソース名
display_name 表示名
description 制約の説明
constraint_default 制約にポリシーが存在しない場合の評価動作
list_constraint リソースのポリシーを設定するときに、特定の値のリストを基準に「許可」または「拒否」するルールを定義
boolean_constraint 「有効」または「無効」にするかを制御する単純なブール値の制約を定義
supports_dry_run この制約がドライラン(dry run)をサポートしているかどうか

制約の名称や説明、ドライランができるかどうかは最低限知りたいので取得します。また、このまま取得すると全て英語でレスポンスが返ってくるので一応日本語の翻訳もつけたいと思います。

翻訳もする

翻訳はCloud Translationを用います。
今回の翻訳ではモデルの訓練などは行わずtranslateメソッドで行います。料金表としては以下となります。

使用料
最初の 500,000 文字 *(1 か月あたり) 無料(毎月 $10 分のクレジットとして適用)
500,001 文字~10 億文字 *(1 か月あたり) $20/100 万文字
10 億文字超*(1 か月あたり) 割引料金についてのご相談は、営業担当者にお問い合わせください。

https://cloud.google.com/translate/pricing?hl=ja

今回のスクリプトでは、1回の実行で約6万文字程度を処理します。そのため、通常は無料枠(50万文字)に収まりますが、他の用途でCloud Translation APIを使用している場合や複数回スクリプトを実行すると料金が発生する可能性があるため十分注意してください。

準備

以下のライブラリを使用しています。事前にインストールしてください。

google-cloud-orgpolicy
google-cloud-translate
pandas
openpyxl

インストールコマンドは以下

pip install google-cloud-orgpolicy google-cloud-translate pandas openpyxl

またGoogle Cloudの以下のAPIを有効化している必要があります。

  • OrgPolicy API
  • Cloud Translation API

認証に関しては、私はローカルから実行するのでGoogle Cloud SDKを使用したADCで行いました。

gcloud auth application-default login

スクリプトを説明

とりあえずスクリプト全文です。

import pandas as pd
from google.cloud import orgpolicy_v2
from google.cloud import translate_v2 as translate

def translate_text(text, target_language="ja"):
    """
    Cloud Translation APIを使用してテキストを翻訳
    """
    client = translate.Client()
    result = client.translate(text, target_language=target_language)
    return result["translatedText"]

def list_constraints_to_excel(project_id, target_language="ja", output_file="constraints.xlsx"):
    """
    制約一覧をExcelファイルに出力
    """
    # Create a client for OrgPolicy
    client = orgpolicy_v2.OrgPolicyClient()
    request = orgpolicy_v2.ListConstraintsRequest(
        parent=project_id,
    )
    print(f"Listing constraints for: {project_id}")
    response = client.list_constraints(request=request)
    data = []
    for constraint in response:
        name = constraint.name
        display_name = constraint.display_name
        description = constraint.description
        constraint_default = constraint.constraint_default.name
        supports_dry_run = constraint.supports_dry_run
        # 翻訳
        translated_display_name = translate_text(display_name, target_language) if display_name else "No display name available"
        translated_description = translate_text(description, target_language) if description else "No description available"
        data.append({
            "Name": name,
            "Display Name": display_name,
            "Translated Display Name": translated_display_name,
            "Description": description,
            "Translated Description": translated_description,
            "Constraint Default": constraint_default,
            "Supports Dry Run": supports_dry_run,
        })

    df = pd.DataFrame(data)
    df.to_excel(output_file, index=False, engine="openpyxl")
    print(f"Constraints exported to {output_file}")

if __name__ == "__main__":
    project_id = "projects/プロジェクトID"  # プロジェクトIDを指定
    output_file = "constraints.xlsx"  # 出力ファイル名
    list_constraints_to_excel(project_id, output_file=output_file)

スクリプト全体の流れ

  1. Google Cloud OrgPolicy API を使用して指定したプロジェクトの制約を取得
  2. 制約の名前、表示名、説明、デフォルト動作、ドライランサポート情報を取得
  3. display_name(表示名) と description(説明) を Google Cloud Translation API を使用して翻訳
  4. 取得したデータをDataFrameに格納し、Excelファイルに出力

※翻訳したくない場合はtranslated_display_nametranslated_descriptionを削除してください


translate_text 関数

def translate_text(text, target_language="ja"):
    client = translate.Client()
    result = client.translate(text, target_language=target_language)
    return result["translatedText"]
  • 役割:
    • Cloud Translation API を使用して、指定されたテキストを翻訳
  • 引数:
    • text: 翻訳するテキスト
    • target_language: 翻訳先の言語コード(デフォルトで日本語"ja"を指定)
  • 戻り値:
    • 翻訳されたテキスト

list_constraints_to_excel 関数

def list_constraints_to_excel(project_id, target_language="ja", output_file="constraints.xlsx"):
  • 役割:
    • 指定されたプロジェクトの制約を取得し、翻訳して Excel ファイルに出力
  • 引数:
    • project_id: プロジェクト ID を指定
    • target_language: 翻訳先の言語(デフォルトは日本語 "ja"
    • output_file: 出力するExcelファイルのパス

制約の取得と翻訳

response = client.list_constraints(request=request)
for constraint in response:
    name = constraint.name
    display_name = constraint.display_name
    description = constraint.description
    constraint_default = constraint.constraint_default.name
    supports_dry_run = constraint.supports_dry_run
    translated_display_name = translate_text(display_name, target_language) if display_name else "No display name available"
    translated_description = translate_text(description, target_language) if description else "No description available"
  • 動作:
    • client.list_constraints を使用して、指定されたプロジェクトの制約を取得
    • 各制約の以下の情報を取得:
      • name: 制約名
      • display_name: 表示名
      • description: 制約の説明
      • constraint_default: 制約のデフォルト動作(ALLOW または DENY
      • supports_dry_run: ドライランのサポート有無
    • display_namedescription を翻訳

データの保存

df = pd.DataFrame(data)
df.to_excel(output_file, index=False, engine="openpyxl")
  • 動作:
    • 取得したデータをDataFrameに格納
    • DataFrameをExcel ファイル(constraints.xlsx)として保存

出力されるExcelファイルには以下の列名が設定されます。

列名 説明
Name 制約名
Display Name 表示名
Translated Display Name 翻訳した表示名
Description 制約の説明
Translated Description 翻訳した説明
Constraint Default 制約のデフォルト動作(ALLOW または DENY
Supports Dry Run ドライランのサポート有無(True または False

結果を見てみる

スクリプトを実行して出力されたExcelファイルを見てみます。
スクリーンショット 2024-12-04 21.31.36

とってもいい感じに出力されていました。日本語の翻訳もリファレンス記載の値と比較してみます。

リファレンス スクリプト
このリスト型制約は、適用される Vertex AI Workbench のノートブックとインスタンスに対して許可されるアクセスのモードを定義します。許可リストまたは拒否リストでは、service-account モードで複数のユーザーの指定、またはsingle-user モードでシングル ユーザー アクセスの指定を行えます。許可または拒否するアクセスモードを明示的に表示する必要があります。constraints/ainotebooks.accessMode このリスト制約は、適用される Vertex AI Workbench ノートブックおよびインスタンスに許可されるアクセス モードを定義します。許可リストまたは拒否リストでは、サービス アカウント モードで複数のユーザーを指定することも、シングル ユーザー モードで単一ユーザーのアクセスを指定することもできます。許可または拒否するアクセス モードは明示的にリストする必要があります。

微妙に表現が異なる箇所はありますがほぼ意味は同じと言えると思います。
全部の制約がスクリプトをたたくだけで一覧表にできるので(そんなに頻度は多くないですが)とても助かります!

所感

ということで、あんまり使う機会がない気もするスクリプトを作ってしまいました笑。スクリプトを作る過程でリファレンスをたくさん読み込んで勉強になったのでとても良かったですが。

Cloud Translationの使いやすさも感動しましたが次はGeminiに翻訳してもらうのとかもやってみたいなーなんて思います。

さてさてGoogle Cloud Advent Calendar 2024の明日 12/5 の投稿担当は村田一紘さんです!

ではでは、また明日!ナマステー

参考

https://cloud.google.com/python/docs/reference/orgpolicy/latest/google.cloud.orgpolicy_v2.services.org_policy

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.